<script>
    function sleep(delay = 1000) {
        return new Promise(resolve => setTimeout(resolve, delay))
    }

    async function fn1() {
        console.log('async1 a')
        await sleep(0)
        console.log('async1 b')
        return 'async1 c'
    }

    async function fn2() {
        console.log('async2 a')
        // 如果不是一个 Promise，
        // await 会把该值转换为已正常处理的 Promise，然后等待其处理结果
        await 'nothing'
        console.log('async2 b')
    }

    async function fn3() {
        console.log('async3 a')
        await // 什么都没有，等同于一般函数
        console.log('async3 b')
    }

    function bar() {
        console.log('bar')
    }
    async function fn4() {
        console.log('async4 a')
        await bar() // 执行 bar，将非 promise 返回值转换成 promise
        console.log('async4 b')
    }

    fn1().then(console.log)
    fn2()
    fn3()
    fn4()
    console.log('sync')

    // 简单理解：只有 await 后有东西时，后续代码可看作一个微任务，类似 Promise.then(...)
    // 当一个任务退出且执行上下文为空的时候，微任务队列中的每一个微任务会依次被执行
</script>
